const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
// 引入jsonwebtoken
const jwt = require('jsonwebtoken');
const app = express();

app.use(bodyParser.urlencoded({extended:true}));
app.use(cookieParser());
// json web token  JWT
// 创建jwt密钥 
const secret = 'zihao';
let user = {};
// 注册
app.post('/register',(req,res)=>{
    user = req.body;
    console.log(user);
    res.send('注册成功！！');
})
// 登录
app.post('/login',(req,res)=>{
    if(req.body.name == user.name && req.body.password == user.password){
        const userItem = req.body;
        // 给userItem加过期时间，当过期后自动删除
        userItem.exp = Date.now() + 120*1000; 
        // sign创建token
        jwt.sign(userItem,secret,(err,token)=>{
            console.log('这是token:')
            console.log(token);
            // 将形成的token 作为cookie返回浏览器
            res.cookie('token',token,{
                maxAge:30*1000
            })
            res.send('登录成功！！,携带cookie字符串');
        })
    }else{
        res.send('用户名或者密码错误')
    }
})
// 验证
app.get('/test',(req,res)=>{
    console.log(req.cookies);
    // 找到随着请求报文和响应报文传递的cookie中的token
    // 验证该token是否是当初在jwt中产生的token
    jwt.verify(req.cookies.token,secret,(err,authData)=>{
        if(err){
            console.log(err);
        }else{
            console.log(authData);
            res.send('核验token');
        }
    })
})
app.listen(3000,err=>{
    if(!err) console.log('服务器启动成功！！');
    else console.log(err);
})


/* 
数据库（database）就是一个仓库 在仓库中存放数据
// 小超市的数据库
// 苹果 10斤 4块/斤    梨子10斤  5元/斤   name:苹果  number:10斤 price：5
// 裤子 100条  100元/条  外套 300件 250元/件  帽子300个 10元/件
// 小汽车250个 100元/个   橡皮泥 300件 10元/件

// 分类进行存放   三类  水果  衣服  玩具
集合（collection）分类管理数据和信息 注：集合起名的时候写成英文的复数
文档（document）一条条的数据

指令：
show databases 显示所有数据库  可以简写为 show dbs
use 数据库的名字  切换到指定数据库当中
show collections  显示数据库当中所有的集合
db.集合名.drop()  删除当前集合
db.dropDatabase() 删除当前数据库

往集合当中插入数据(首先查看是否在当前数据库下  use 数据库的名字)
db.集合名.insert({})
db.集合名.insertOne({})
插入一条数据

db.集合名.insertMany([{},{}])  
插入多条数据

注意：当数据库当中没有该集合时，插入数据自动生成该集合

查询
db.数据库的名字.find()  查询到数据库当中的所有的文档
db.数据库的名字.find({查询条件})
例如要查询数据库当中有多少条裤子  db.clothes.find({name:'裤子'}) 

查询范围
小于 $lt
db.集合名.find({属性名:{$lt:值}})
例如 查询年龄小于21
db.users.find({age:{$lt:21}})
小于等于 $lte
db.users.find({age:{$lte:20}})
大于 $gt
db.users.find({age:{$gt:20}})
大于等于 $gte
db.users.find({age:{$gte:20}})
等于 $eq
db.users.find({age:{$eq:20}})
$in或者
db.users.find({age:{$in:[10,25]}})
含义：查询年龄是10岁或者25岁
$or或者
db.users.find({$or:[{age:10},{age:25}]})
含义：查询年龄是10岁或者25岁

在find查询当中可以使用正则表达式
db.users.find({name:正则表达式})
 find查询时还可以写函数
db.users.find({$where:function(){return 条件}})
this当前的文档对象 

投影：过滤不想要的字段，保留想要的字段
例如：db.users.find({name:'小明'},{_id:0,hobby:0}) 去除_id和hobby两个字段，保留其他字段
例如：db.users.find({name:'小明'},{name:1})  保留_id和name字段，去除其他字段
注意特殊_id若想过滤掉 就必须写_id:0
属性名后面为1保留该字段 如果为0就是删除该字段

改（更新数据）
db.集合名.updateOne(查询条件，更新内容，配置对象)
更新一条数据
db.集合名.updateMany(查询条件，更新内容，配置对象)
更新多条数据
db.users.updateMany({age:20},{$set:{age:15}})
$set只修改指定字段
$inc 指定字段增加的数
例如：db.users.updateMany({age:16},{$inc:{age:2}})
查询到集合当中age为16岁的字段，并且每一个文档中的age都增加2

删
数据库  集合  文档

删除文档
db.集合名.remove(查询条件) 查询条件 find中能写什么，它就能写什么
删除集合
db.集合名.remove({}) 
db.集合名.drop()
删除数据库
db.dropDatabase()



*/
